- 每日溫度(Daily Temperatures) - 題號:739
題目描述:根據每日氣溫列表,請返回一個列表,其中存儲了你需要等待多久才能看到一個更高的溫度。如果之後都沒有更高的溫度,那麽將在該位置存放 0。
def dailyTemperatures(T):
stack, result = [], [0] * len(T)
for i, temp in enumerate(T):
while stack and temp > T[stack[-1]]:
j = stack.pop()
result[j] = i - j
stack.append(i)
return result
- 下一個更大元素I(Next Greater Element I) - 題號:496
題目描述:給定兩個沒有重覆元素的數組 nums1 和 nums2 ,其中 nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下一個比其大的值,如果不存在下一個更大的值,返回 -1 。
def nextGreaterElement(nums1, nums2):
stack, mapping = [], {}
for num in nums2:
while stack and num > stack[-1]:
mapping[stack.pop()] = num
stack.append(num)
return [mapping.get(num, -1) for num in nums1]
- 下一個更大元素II(Next Greater Element II) - 題號:503
題目描述:給定一個循環數組(最後一個元素的下一個元素是第一個元素),輸出每個元素的下一個更大元素。
def nextGreaterElements(nums):
stack, result = [], [-1] * len(nums)
for i in range(2 * len(nums) - 1):
while stack and nums[i % len(nums)] > nums[stack[-1]]:
result[stack.pop()] = nums[i % len(nums)]
stack.append(i % len(nums))
return result
- 接雨水(Trapping Rain Water) - 題號:42
題目描述:給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
def trap(height):
left, right = 0, len(height) - 1
left_max, right_max = 0, 0
result = 0
while left < right:
if height[left] < height[right]:
if height[left] >= left_max:
left_max = height[left]
else:
result += left_max - height[left]
left += 1
else:
if height[right] >= right_max:
right_max = height[right]
else:
result += right_max - height[right]
right -= 1
return result
- 柱狀圖中最大的矩形(Largest Rectangle in Histogram) - 題號:84
題目描述:給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 ,求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。
def largestRectangleArea(heights):
stack, max_area = [], 0
heights.append(0)
for i in range(len(heights)):
while stack and heights[i] < heights[stack[-1]]:
height = heights[stack.pop()]
width = i if not stack else i - stack[-1] - 1
max_area = max(max_area, height * width)
stack.append(i)
return max_area